﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using Datos;

namespace Negocio
{
    public class Empleado : Persona
    {
        
        #region Constantes

        const string ERR_SOURCE = "Empleado";
        const string USUARIO_LOGIN = "usuarioLogin";

        #endregion

        #region Atributos y Propiedades


        private string _legajo;
        public string Legajo
        {
            get { return _legajo; }
            set { _legajo = value; MarcarModificado(); }
        }

        private string _cuil;
        public string Cuil
        {
            get { return _cuil; }
            set { _cuil = value; MarcarModificado(); }
        }
                
        private bool _activo;
        public bool Activo
        {
            get { return _activo; }
            set { _activo = value; MarcarModificado(); }
        }
        
        private string _observacion;
        public string Observacion
        {
            get { return _observacion; }
            set { _observacion = value; MarcarModificado(); }
        }
        
        private  Usuario _usuario;
        public Usuario Usuario
        {
            get
            {
                if (_usuario == null && GetClaveONull(USUARIO_LOGIN) != null)
                    _usuario = Usuario.ObtenerPorLogin(GetClave(USUARIO_LOGIN).ToString());
                return _usuario;
            }
            set
            {
                SetClave(USUARIO_LOGIN, value != null ? (object)value.Login : null);
                _usuario = value;
                MarcarModificado();
            }
        }

        #endregion

        #region Acceso a Datos

        protected override bool LeerDB()
        {
            bool existe = false;
            object[] parametros = { null, null, null, null, null, null, null, null, _legajo, null, null, null, null, null, null };
            IDataReader dr = DatosOleDb.DB().ObtenerDataReader("EmpleadoSFiltro", parametros);
            if (dr.Read())
            {
                CargarDR(dr);
                existe = true;
            }
            dr.Close();
            return existe;
        }

        protected override void InsertDB()
        {
            object[] parametros = new object[] { _nombre, _apellido, _telefono, _direccion, _barrio, _localidad, _provincia, _email, _legajo, _cuil, _activo,  _observacion, GetClaveONull(USUARIO_LOGIN) };
            DatosOleDb.DB().TxBegin();
            try
            {
                DatosOleDb.DB().EnviarDatos("EmpleadoI", ref parametros);
                DatosOleDb.DB().TxCommit();
            }
            catch (System.Data.OleDb.OleDbException)
            {
                DatosOleDb.DB().TxRollback();
                DatosException ex = new DatosException("Ya existe un Empleado con el legajo " + _legajo, ERR_SOURCE);
                throw ex;
            }
            catch (Exception)
            {
                DatosOleDb.DB().TxRollback();
                throw;
            }
        }

        protected override void UpdateDB()
        {
            object[] parametros = new object[] { _nombre, _apellido, _telefono, _direccion, _barrio, _localidad, _provincia, _email, _legajo, _cuil, _activo, _observacion, GetClaveONull(USUARIO_LOGIN) };
            DatosOleDb.DB().TxBegin();
            try
            {
                DatosOleDb.DB().EnviarDatos("EmpleadoU", ref parametros);
                DatosOleDb.DB().TxCommit();
            }
            catch (System.Data.OleDb.OleDbException)
            {
                DatosOleDb.DB().TxRollback();
                DatosException ex = new DatosException("Error al acutalizar los datos del Empleado con el legajo " + _legajo, ERR_SOURCE);
                throw ex;
            }
            catch (Exception)
            {
                DatosOleDb.DB().TxRollback();
                throw;
            }
        }

        protected override void DeleteDB()
        {
            object[] parametros = new object[] { _legajo };
            DatosOleDb.DB().TxBegin();
            try
            {
                DatosOleDb.DB().EnviarDatos("EmpleadoD", ref parametros);
                DatosOleDb.DB().TxCommit();
            }
            catch (Exception)
            {
                DatosOleDb.DB().TxRollback();
                throw;
            }
        }

        protected override void CargarDR(IDataReader dr)
        {
            _nombre = dr["nombre"].ToString();
            _apellido = dr["apellido"].ToString();
            _telefono = dr["telefono"].ToString();
            _direccion = dr["direccion"].ToString();
            _barrio = dr["barrio"].ToString();
            _localidad = dr["localidad"].ToString();
            _provincia = dr["provincia"].ToString();
            _email = dr["email"].ToString();
            _legajo = dr["legajo"].ToString();
            _cuil = dr["cuil"].ToString();            
            _activo = (Boolean)dr["activo"];            
            _observacion = dr["observacion"].ToString();
            SetClave(USUARIO_LOGIN, dr[USUARIO_LOGIN]);
            MarcarViejo();
        }

        public override void Validar()
        {
            InconsistenciaException ex = new InconsistenciaException();
            ex.Source = ERR_SOURCE;
            if (_legajo == string.Empty) ex.AgregarError("Dato requerido", "Legajo");
            if (_nombre == string.Empty) ex.AgregarError("Dato requerido", "Nombre");
            if (_apellido == string.Empty) ex.AgregarError("Dato requerido", "Apellido");
            ex.Lanzar();
        }

        #endregion

        #region Métodos estéticos de Clase

        public static Empleado ObtenerPorCodigo(string codigo)
        {
            Empleado obj = new Empleado();
            obj._legajo = codigo;
            if (obj.LeerDB())
            {
                return obj;
            }
            else
            {
                return null;
            }
        }

        public static List<Empleado> ObtenerTodos()
        {
            Empleado obj;
            List<Empleado> lista = new List<Empleado>();
            object[] parametros = { null, null, null, null, null, null, null, null, null, null, null, null, null, null, null };
            IDataReader dr;
            dr = DatosOleDb.DB().ObtenerDataReader("EmpleadosFiltro", parametros);
            while (dr.Read())
            {
                obj = new Empleado();
                obj.CargarDR(dr);
                lista.Add(obj);
            }
            dr.Close();
            return lista;
        }

        public static List<Empleado> ObtenerPorFiltro(string nombre, string apellido, string legajo, string cuil)
        {
            Empleado obj;
            List<Empleado> lista = new List<Empleado>();
            object[] parametros = { nombre, apellido, null, null, null, null, null, null, legajo, cuil, null, null, null, null, null };
            IDataReader dr;
            dr = DatosOleDb.DB().ObtenerDataReader("EmpleadosFiltro", parametros);
            while (dr.Read())
            {
                obj = new Empleado();
                obj.CargarDR(dr);
                lista.Add(obj);
            }
            dr.Close();
            return lista;
        }
        #endregion
    }
}
